package com.boot.core.common.util;/**
 * @description
 * @autor xbwu on 2018/5/28.
 */

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.Locale;

/**
 * jdk8新版时间处理工具类
 * 参考：https://blog.csdn.net/chenxun_2010/article/details/72539981
 * @author xbwu
 * @create 2018-05-28
 *
 *  java。time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中，下面是一些关键类

    ●Instant——它代表的是时间戳

    ●LocalDate——不包含具体时间的日期，比如2014-01-14。它可以用来存储生日，周年纪念日，入职日期等。

    ●LocalTime——它代表的是不含日期的时间

    ●LocalDateTime——它包含了日期及时间，不过还是没有偏移信息或者说时区。

    ●ZonedDateTime——这是一个包含时区的完整的日期时间，偏移量是以UTC/格林威治时间为基准的。
 **/
public class DateUtils {
    /**
     * 小于
     */
    private static final String LT="lt";
    /**
     * 等于
     */
    private static final String EQ="eq";
    /**
     * 大于
     */
    private static final String GT="gt";



    /**
     * 获取当前年月日
     * @return
     */
    public static String getNowDateFormat(){
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return dtf.format(LocalDate.now());
    }

    /**
     * 获得当年年月日时分秒
     * @return
     */
    public static String getNowDateTimeFormat(){
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return dtf.format(LocalDateTime.now());
    }

    /**
     * 获取指定的日期
     * @return
     */
    public static LocalDate getAssignDate(int year,int month,int day){
        return LocalDate.of(year,month,day);
    }



    /**
     * 日期对比
     * @param date1
     * @param date2
     * @param mode 比较模式
     * @return
     */
    public boolean dateCompare(Date date1,Date date2,String mode){
        LocalDateTime ld1=dateToLocalDate(date1);
        LocalDateTime ld2=dateToLocalDate(date2);
        return dateCompare(ld1,ld2,mode);
    }

    /**
     * 日期对比
     * @param date1
     * @param date2
     * @param mode 比较模式
     * @return
     */
    public static boolean dateCompare(LocalDateTime date1,LocalDateTime date2,String mode){
        boolean result=false;
        switch(mode){
            case LT:
                result= date1.isBefore(date2);
                break;
            case EQ:
                result= date1.isEqual(date2);
                break;
            case GT:
                result= date1.isAfter(date2);
                break;
            default:
        }
        return result;
    }

    /**
     * 时间增加或减少
     * @param date
     * @param cu 时间单位
     */
    public Date addOrSubTimeD(Date date,long value,ChronoUnit cu){
        LocalDateTime ldt=dateToLocalDate(date);
        LocalDateTime after=addOrSubTimeL(ldt,value,cu);
        return localDateToDate(after);
    }

    /**
     * 时间增加或减少
     * @param date
     * @param cu 时间单位
     */
    public LocalDateTime addOrSubTimeL(LocalDateTime date,long value,ChronoUnit cu){
        LocalDateTime ld=date.plus(value,cu);
        return ld;
    }
    /**
     * 表示固定的日期api：YearMonth
     */
    private void yearMonth(){
        // 而信用卡过期时间等,可以使用YearMonth
        YearMonth ym=YearMonth.now();
        //返回对应月份总共天数
        ym.lengthOfMonth();
        //判断是否闰年
        ym.isLeapYear();
    }

    /**
     * 时间相差数
     */
    private void interval(){
        LocalDate d1=LocalDate.of(2018,5,28);
        LocalDate d2=LocalDate.of(2017,5,28);
        //相差天数
        System.out.println(Math.abs(d1.toEpochDay()-d2.toEpochDay()));
        //相差月数
        System.out.println(Math.abs(Period.between(d1,d2).getYears()*12+Period.between(d1,d2).getMonths()));
    }

    /**
     * 新版时间格式化
     */
    private void formatDate(){
        //格式化新版时间，需要一个在格式化工具处设置时区，否则无法转换，Instant和LocalDateTime默认没有时区信息
        DateTimeFormatter df =
                DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                        .withLocale( Locale.getDefault())
                        .withZone( ZoneId.systemDefault());
        Instant now = Instant.now();
        String format = df.format(now);
        System.out.println(format);
        //也可以在时间本身上设置时区
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
        //Instant now = Instant.now();
        //now.atZone(ZoneId.systemDefault());
        String format2 = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(format2);
    }

    /**
     * Instant和Date互相转换
     */
    private void conversion(){
        Date date=new Date();
        Instant is=date.toInstant();
        Date date2=Date.from(is);
    }

    /**
     * Date转LocalDate
     * @param date
     * @return
     */
    public LocalDateTime dateToLocalDate(Date date){
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime lt = instant.atZone(zoneId).toLocalDateTime();
        return lt;
    }

    /**
     * LocalDate转Date
     * @param localDateTime
     * @return
     */
    public Date localDateToDate(LocalDateTime localDateTime){
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zdt = localDateTime.atZone(zoneId);
        Date date = Date.from(zdt.toInstant());
        return date;
    }
}
